package com.powernode.bank.service.impl;

import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.dao.impl.AccountDaoImpl;
import com.powernode.bank.exceptions.MoneyNotEnoughException;
import com.powernode.bank.exceptions.TransferException;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.service.AccountService;
import com.powernode.bank.utils.GenerateDaoProxy;
import com.powernode.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;

public class AccountServiceImpl implements AccountService {
    // private AccountDao accountDao=new AccountDaoImpl();

    //这是我们自己封装的
    // private AccountDao accountDao= ((AccountDao) GenerateDaoProxy.generate(SqlSessionUtil.openSession(), AccountDao.class));

    // 在mybatis中提供了相关的机制，也可以动态为我们生成dao接口的是实现类（代理类）
    // mybatis当中实际上采用了代理模式，在内存中生成dao接口的代理类，然后创建代理类的实例
    // 使用mybatis这种代理机制的前提是，SqlMapper.xml文件中的namespace必须是dao接口的全限定类名，id是dao接口的方法名
    private AccountDao accountDao=SqlSessionUtil.openSession().getMapper(AccountDao.class);


    @Override
    public void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, TransferException {
        // 添加事务控制代码
        SqlSession sqlSession= SqlSessionUtil.openSession();

        // 1.判断转出账户余额是否充足
        Account fromAccount = accountDao.selectByActno(fromActno);
        if (fromAccount.getBalance()<money) {
            // 2.如果转出账户余额不足，提示用户
            throw new MoneyNotEnoughException("对不起，余额不足！");
        }
        // 3.如果转出账户余额充足，更新转出账户余额
        // 先跟新内存中Java对象account的余额
        Account toAccount = accountDao.selectByActno(toActno);
        fromAccount.setBalance(fromAccount.getBalance()-money);
        toAccount.setBalance(toAccount.getBalance()+money);
        int count=accountDao.updateByActno(fromAccount);

        // String s=null;
        // s.toString();

        // 4.更新转入账户余额
        count+=accountDao.updateByActno(toAccount);
        if (count!=2) {
            throw new TransferException("转账异常");
        }

        // 提交事务
        sqlSession.commit();
        // 关闭事务
        SqlSessionUtil.close(sqlSession);
    }
}
